/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.svh.Servicios;

import com.svh.Dao.Impl.ModuloDaoImpl;
import com.svh.Dao.Impl.PerfilDaoImpl;
import com.svh.Dao.Impl.PermisoDaoImpl;
import com.svh.Dao.ModuloDao;
import com.svh.Dao.PerfilDao;
import com.svh.Dao.PermisoDao;
import com.svh.Entidad.Modulo;
import com.svh.Entidad.Perfil;
import com.svh.Entidad.Permiso;
import com.svh.Hibernate.HibernateConexion;
import com.svh.Utils.IConexion;
import com.svh.Utils.Utilitario;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 *
 * @author Luis Alonso Ballena Garcia
 */
public class PerfilServicio {

    IConexion conexion;
    PerfilDao<Perfil> daoPerfil;
    PermisoDao<Permiso> daoPermiso;
    ModuloDao<Modulo> daoModulo;

    public PerfilServicio() {
        conexion = new HibernateConexion();
        daoPerfil = new PerfilDaoImpl(conexion);
        daoPermiso = new PermisoDaoImpl(conexion);
        daoModulo = new ModuloDaoImpl(conexion);
    }

    public List<Permiso> obtenerPermisosPorPerfil(Integer id) {
        conexion.beginConexion();
        List<Permiso> auxPermisos = new ArrayList<Permiso>();
        auxPermisos = daoPermiso.getPermisosPorPerfil(id);
        conexion.closeConexion();
        return auxPermisos;
    }

    public List<Modulo> obtenerModulos() {
        List<Modulo> modulos = new ArrayList<Modulo>();
        conexion.beginConexion();
        modulos = daoModulo.obtenerTodos(Modulo.class);
        conexion.closeConexion();
        return modulos;
    }

    public void actualizarPerfil(Perfil perfil, List<Modulo> modulos) {
        List<Permiso> permisos = ensamblarPermisos(modulos,perfil);
        perfil.setPermisos(new HashSet<Permiso>(permisos));
        conexion.beginTransaccion();
        daoPerfil.actualizar(perfil);
        Utilitario.enviarMensajeGlobalValido("Se ha actualizado correctamente");
        conexion.closeTransaccion();
    }

    public void registrarPerfil(Perfil perfil, List<Modulo> modulos) {
        List<Permiso> permisos = ensamblarPermisos(modulos,perfil);
        perfil.setPermisos(new HashSet<Permiso>(permisos));
        conexion.beginTransaccion();
        daoPerfil.agregar(perfil);
        Utilitario.enviarMensajeGlobalValido("Se ha registrado correctamente");
        conexion.closeTransaccion();
    }

    public Perfil obtenerPerfilPorID(Integer id) {
        conexion.beginConexion();
        Perfil aux = null;
        aux = daoPerfil.buscarPorId(Perfil.class, id);
        conexion.closeConexion();
        return aux;
    }

    public List<Modulo> cargarModuloConPermiso(Integer id) {
        conexion.beginConexion();
        List<Modulo> modulos = new ArrayList<Modulo>();
        modulos = daoModulo.obtenerTodos(Modulo.class);
        List<Permiso> permisos = daoPermiso.getPermisosPorPerfil(id);
        conexion.closeConexion();
        modulos = ensamblarModulos(permisos, modulos);
        return modulos;
    }

    private List<Permiso> ensamblarPermisos(List<Modulo> modulos, Perfil perfil) {
        List<Permiso> aux = new ArrayList<Permiso>();
        for (Modulo mod : modulos) {
            Permiso permiso = mod.getPermiso();
            permiso.setModulo(mod);
            permiso.setPerfil(perfil);
            aux.add(permiso);
        }
        return aux;
    }

    private List<Modulo> ensamblarModulos(List<Permiso> permisos, List<Modulo> modulos) {
        int i=0;
        for(Modulo mod : modulos)
        {   
            i=0;
            for(Permiso permi : permisos){
                if(mod.getId().intValue() == permi.getModulo().getId().intValue()){
                    mod.setPermiso(permi);
                    permisos.remove(i);
                    break;
                }
                i++;
            }
        }
        return modulos;
    }

    /**
     * VALIDACIONES *
     */
}
